package com.pan.behavioral.chain;

import com.pan.behavioral.chain.node.ChainNode;
import com.pan.behavioral.chain.node.score.ScoreFail;
import com.pan.behavioral.chain.node.score.ScorePass;
import com.pan.behavioral.chain.node.shape.ShapeNode;
import com.pan.behavioral.chain.node.shape.impl.CircleNode;
import com.pan.behavioral.chain.node.shape.impl.GreenNode;
import com.pan.behavioral.chain.node.shape.impl.RedNode;
import com.pan.behavioral.chain.node.shape.impl.SquareNode;
import com.pan.behavioral.chain.utils.ShowUtils;

import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * 责任链模式
 *
 * 为请求创建了一个接收者对象的链。这种模式给予请求的类型，对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
 * 在这种模式中，通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求，那么它会把相同的请求传给下一个接收者，依此类推。
 *
 *
 * 优点：
 * 1、降低耦合度。它将请求的发送者和接收者解耦。
 * 2、简化了对象。使得对象不需要知道链的结构。
 * 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序，允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
 *
 * 缺点：
 * 1、不能保证请求一定被接收。
 * 2、系统性能将受到一定影响，而且在进行代码调试时不太方便，可能会造成循环调用。
 * 3、可能不容易观察运行时的特征，有碍于除错。
 *
 */
public class ChainOfResponsibilityApplication {
    public static void main(String[] args) {

        System.out.println("纯责任链模式（传到符合条件的节点就把它给处理完成）");
        ChainNode scoreHandle = new ScorePass(new ScoreFail(null));
        for (int i = 0; i < 50; i++) {
            int score = (int) (120 * Math.random());
            scoreHandle.response(score);
        }

        System.out.println("不纯责任链模式（传到符合条件的节点就处理对应的部分）");
        ShapeNode shapeChain = new RedNode(//后面的图画是红色的
                new CircleNode(//画个圆
                        new GreenNode(//后面画图的颜色是绿色
                                new SquareNode(null)//画个正方形
                        )
                )
        );
        BufferedImage bufferedImage = new BufferedImage(150,150,BufferedImage.TYPE_INT_RGB);
        Graphics graphics = bufferedImage.getGraphics();

        shapeChain.response(graphics);
        graphics.dispose();

        ShowUtils.INSTANCE.showImage(bufferedImage);


    }
}
